/***************************************************************************
 *   Copyright (C) 2005 by xihe   *
 *   xihels@163.com                                                        *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/
#ifndef _CLUSTER_SEND_IM_H_
#define _CLUSTER_SEND_IM_H_
#include "ClusterOperateReply.h"
#include "ImPacketFont.h"
/**
 * 扩展固定群消息发送包，相对于已经有的固定群消息发送包来说，这个多了一些标志，
 * 同时旧的群消息发送包为了兼容性的考虑TX依然保留：
 * 1.  头部
 * 2.  子命令，1字节，0x1A
 * 3.  群内部ID，4字节
 * 4.  后面的数据的总长度，2字节
 * 5.  2字节，未知，一般为0x0001
 * 6.  消息分片数，1字节。群消息分片也是最大700字节，
 *	但是这个和普通消息不一样的是：这个700包含了这些控制信息
 * 7.  分片序号，1字节，从0开始
 * 8.  消息id，2字节，同一条消息的不同分片id相同
 * 9.  4字节，未知
 * 10. 消息内容
 * 11. 空格和0x00
 * 12. 消息的尾部，包含一些消息的参数，比如字体颜色啦，等等等等，顺序是
 *     1. 字体修饰属性，bold，italic之类的，1字节，具体的设置是
 *         i.   bit0-bit4用来表示字体大小，所以最大是32
 *         ii.  bit5表示是否bold
 *         iii. bit6表示是否italic
 *         iv.  bit7表示是否underline
 *     2. 颜色Red，1字节
 *     3. 颜色Green，1字节
 *     4. 颜色Blue，1字节
 *     5. 1个未知字节，置0先
 *     6. 消息编码，2字节，0x8602为GB，0x0000为EN，其他未知，好像可以自定义，因为服务器好像不干涉
 *     7. 可变长度的一段信息，字体名后面跟一个回车符，比如0xcb, 0xce, 0xcc, 0xe5,表示宋体
 * 13. 1字节，表示11和12部分的字节长度
 * 14. 尾部 
 * 
 * 注意：只有最后一个分片有11, 12, 13部分
 */

class ClusterSendIMPacket : public OutPacket {
    public:
	ClusterSendIMPacket(QQClient& cl, 
		const string msg, 
		uint32_t _receiver,
		uint16_t _messageId = 0,
		uint8_t  _fragmentSequence = 0
		);
	int putBody(uint8_t* buf) const;
	
	void setTotalFragments(uint8_t _totalFragments)
       	{ totalFragments = _totalFragments; }
    private:
	uint32_t	    clusterId;
	string	    message;
	ImPacketFont    font;
	uint16_t	    messageId;
	uint8_t	    totalFragments;
	uint8_t	    fragmentSequence;
};


/**
 * 发送群信息和发送扩展群信息的回复包
 * 1. 头部
 * 2. 命令类型，1字节，0x0A
 * 3. 回复码，1字节
 * 4. 群内部id，4字节
 * 5. 尾部
 */

class ClusterSendIMReplyPacket : public ClusterOperateReply {
    protected:
	ClusterSendIMReplyPacket(const uint8_t* buf, int len) :
	    ClusterOperateReply(buf, len, true),
	    replyCode(*(buf + QQ_HEADER_LENGTH_CLUSTER_IN))
	{}
    public:
	uint8_t getReplyCode() const { return replyCode; }
    private:
	uint8_t replyCode;
};

#endif // _CLUSTER_SEND_IM_H_

